对于函数模板，可以为类模板参数设置默认值。例如，在Stack<>类中，可以将用于管理元素的容器定义为第二个模板参数，并使用std::vector<>作为默认值:

\hspace*{\fill} \\ %插入空行
\noindent
\textit{basics/stack3.hpp}
\begin{lstlisting}[style=styleCXX]
#include <vector>
#include <cassert>

template<typename T, typename Cont = std::vector<T>>
class Stack {
private:
	Cont elems; // elements
	
public:
	void push(T const& elem); // push element
	void pop(); // pop element
	T const& top() const; // return top element
	bool empty() const { // return whether the stack is empty
		return elems.empty();
	}
};

template<typename T, typename Cont>
void Stack<T,Cont>::push (T const& elem)
{
	elems.push_back(elem); // append copy of passed elem
}

template<typename T, typename Cont>
void Stack<T,Cont>::pop ()
{
	assert(!elems.empty());
	elems.pop_back(); // remove last element
}

template<typename T, typename Cont>
T const& Stack<T,Cont>::top () const
{
	assert(!elems.empty());
	return elems.back(); // return last element
}
\end{lstlisting}

现在有了两个模板参数，因此成员函数的每个定义都必须用这两个参数定义:

\begin{lstlisting}[style=styleCXX]
template<typename T, typename Cont>
void Stack<T,Cont>::push (T const& elem)
{
	elems.push_back(elem); // append copy of passed elem
}
\end{lstlisting}

可以像以前那样使用这个堆栈。若将第一个也是唯一的参数作为元素类型传递，则会使用vector来管理该类型的元素:

\begin{lstlisting}[style=styleCXX]
template<typename T, typename Cont = std::vector<T>>
class Stack {
private:
	Cont elems; // elements
	...
};
\end{lstlisting}

当在程序中声明Stack对象时，可以指定元素的容器类型:

\hspace*{\fill} \\ %插入空行
\noindent
\textit{basics/stack3test.cpp}
\begin{lstlisting}[style=styleCXX]
#include "stack3.hpp"
#include <iostream>
#include <deque>

int main()
{
	// stack of ints:
	Stack<int> intStack;

	// stack of doubles using a std::deque<> to manage the elements
	Stack<double,std::deque<double>> dblStack;

	// manipulate int stack
	intStack.push(7);
	std::cout << intStack.top() << '\n';
	intStack.pop();

	// manipulate double stack
	dblStack.push(42.42);
	std::cout << dblStack.top() << '\n';
	dblStack.pop();
}
\end{lstlisting}

\begin{lstlisting}[style=styleCXX]
Stack<double,std::deque<double>>
\end{lstlisting}

上面的代码声明一个double数的栈，使用std::deque<>在内部管理元素。















